package net.crozz.openapi.douban;

import net.crozz.openapi.ApiException;
import net.crozz.openapi.douban.model.Resp_token;
import net.crozz.openapi.http.Param;
import net.crozz.openapi.http.Requester;
import net.crozz.openapi.weibo.model.Scope;
import org.apache.commons.lang.StringUtils;

public class Douban {
    private static final String BASE_URL        = "https://api.douban.com";
    private static final String ACCESSTOKEN_URL = "https://www.douban.com/service/auth2/token";
    private final Requester client;
    private final String    client_id;
    private final String    client_secret;
    private final String    redirect_uri;

    public final User user;

    public Douban(Requester client, String client_id, String client_secret, String redirect_uri) {
        this.client = client;
        this.client_id = client_id;
        this.client_secret = client_secret;
        this.redirect_uri = redirect_uri;
        this.user = new User(client, BASE_URL);
    }

    /**
     * OAuth2的authorize接口<br/>
     * 文档地址：http://developers.douban.com/wiki/?title=oauth2
     *
     * @param client_id    必选参数，应用的唯一标识，对应于APIKey
     * @param redirect_uri 必选参数，用户授权完成后的回调地址，应用需要通过此回调地址获得用户的授权结果。此地址必须与在应用注册时填写的回调地址一致。
     * @param scope        可选参数，申请权限的范围，如果不填，则使用缺省的scope。如果申请多个scope，使用逗号分隔。
     * @param state        可选参数，用来维护请求和回调状态的附加字符串，在授权完成回调时会附加此参数，应用可以根据此字符串来判断上下文关系。
     */
    public String authorize(
            String client_id, String redirect_uri, Scope[] scope, String state
    ) {
        String scopeStr = null;
        if (scope != null) {
            scopeStr = StringUtils.join(scope, ",");
        }

        return Requester.makeUrl(
                "https://www.douban.com/service/auth2/auth",
                Param.newParam("client_id", client_id),
                Param.newParam("redirect_uri", redirect_uri),
                Param.newParam("response_type", "code"),
                Param.newParam("scope", scopeStr),
                Param.newParam("state", state)
        );
    }

    /**
     * 获取access_token<br/>
     * 文档地址：http://developers.douban.com/wiki/?title=oauth2
     *
     * @param client_id     必选参数，应用的唯一标识，对应于APIKey
     * @param client_secret 必选参数，应用的唯一标识，对应于豆瓣secret
     * @param redirect_uri  必选参数，用户授权完成后的回调地址，应用需要通过此回调地址获得用户的授权结果。此地址必须与在应用注册时填写的回调地址一致。
     * @param code          必选参数，上一步中获得的authorization_code
     */
    public Resp_token token(String client_id, String client_secret, String redirect_uri, String code) throws ApiException {
        return client.postObj(
                Resp_token.class,
                "https://www.douban.com/service/auth2/token",
                Param.newParam("client_id", client_id),
                Param.newParam("client_secret", client_secret),
                Param.newParam("redirect_uri", redirect_uri),
                Param.newParam("grant_type", "authorization_code"),
                Param.newParam("code", code)
        );
    }

}
